package com.yixun.qfbao.hander;

import com.alibaba.fastjson.JSONObject;
import com.yixun.qfbao.api.service.InitDataService;
import com.yixun.qfbao.apidto.InitDataReqDto;
import com.yixun.qfbao.apidto.InitDataResDto;
import com.yixun.qfbao.dto.base.BaseRequestDTO;
import com.yixun.qfbao.dto.base.BaseResponseDTO;
import com.yixun.qfbao.hander.base.CommonAbstractHander;
import com.yixun.qfbao.model.Company;
import com.yixun.qfbao.model.dto.CompanyDto;
import com.yixun.qfbao.model.enums.DelFlagEnum;
import com.yixun.qfbao.model.enums.InitTypeEnum;
import com.yixun.qfbao.service.CompanyService;
import com.yixun.qfbao.utils.LoginUtils;
import com.yixun.qfbao.vo.InitDataReqVo;
import com.yixun.qfbao.xf.model.enums.ResultEnum;
import net.sf.ehcache.Cache;
import net.sf.ehcache.CacheManager;
import net.sf.ehcache.Element;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;


/**
 * 1、清除缓存
 *  需要将缓存的key传入进来,只有companyUuid是根据公司自动算出来的,前缀需要添加
 *  城市缓存多了一个城市Id,此Id需要事先获取传进来才能清除缓存
 *
 * 2、初始化微信配置
 *  companyUuids: 指定初始化的公司
 *  根据 companyUuids 生成 List<Company> companyList(实际初始化的公司)
 *  若没有传递 companyUuids, 怎会初始化所有公司.存在记录公司不动.
 *  此处只做新增,不做其他修改
 *
 * 3、初始化微信模板
 *  初始化模板内容,根据微信配置全部进行初始化
 *  初始化必须指定 companyUuids, 未开通的公司不进行初始化(会导致不可预期的问题)
 *  初始化完成之后,需要手动根据模板类型去更新实际的微信模板id
 *
 * @Description 获取楼盘信息
 * @Date 2018/1/10
 * @Author sangtao
 * @Computer Administrator
 */
@Service("initDataHander")
public class InitDataHander extends CommonAbstractHander {
    private Logger logger = LoggerFactory.getLogger(InitDataHander.class);

    @Autowired
    private InitDataService initDataService;
    @Autowired
    private CompanyService companyService;
    @Autowired
    private LoginUtils loginUtils;
    @Autowired
    private CacheManager cacheManager;

    @SuppressWarnings("rawtypes")
    @Override
    public BaseResponseDTO doBusiness(BaseRequestDTO reqDto) {
        InitDataReqVo req = (InitDataReqVo)reqDto;
        InitDataReqDto reqDto1 = req.getParams();
        BaseResponseDTO<InitDataResDto> res = new BaseResponseDTO<InitDataResDto>();
        InitDataResDto resDto = new InitDataResDto();
        try {
            List<String> companyUuids = reqDto1.getCompanyUuids();
            CompanyDto companyDto = new CompanyDto();
            companyDto.setDelFlag(DelFlagEnum.UNDEL.getNo());
            companyDto.setCompanyType(20L);
            //所有需要初始化的公司
            List<Company> companyList = companyService.selectListByDto(companyDto);
            if(null == companyList || companyList.size() == 0){
                resDto.setResult(ResultEnum.FAIL.getNo());
                resDto.setErrorCode("未找到可初始化的公司!");
                return res;
            }
            //最終參與計算的公司
            List<Company> calCompanyList = new ArrayList<>();
            for(Company company: companyList){
                if(StringUtils.isNotEmpty(company.getCompanyUuid())){
                    if(null != companyUuids && companyUuids.size() > 0){
                        //存在指定初始化公司
                        for(String companyUuid: companyUuids){
                            if(company.getCompanyUuid().equals(companyUuid)){
                                calCompanyList.add(company);
                            }
                        }
                    }else{
                        //不存在指定公司,初始化全部
                        calCompanyList.add(company);
                    }
                }
            }
            reqDto1.setCompanyList(calCompanyList);
            // 0类型,清除缓存
            // 微信缓存: access_token_key_
            // 省份缓存: province_
            // 城市缓存: city_${cityId}_
            // 城市缓存,需将清除的城市自己找出来
            if(InitTypeEnum.TYPE_ZERO.getNo().equals(reqDto1.getInitType())){
                for(Company company: calCompanyList){
                    String cacheKey = reqDto1.getCacheKey();
                    String actualKey = cacheKey + company.getCompanyUuid();
                    loginUtils.remove(actualKey);
                }
            }else{
                resDto = initDataService.initData(reqDto1);
            }
        } catch (Exception e) {
            logger.error("init data error: {}", e);
            resDto.setResult(ResultEnum.FAIL.getNo());
            resDto.setErrorCode("初始化失败,初始化数据类型: " + reqDto1.getInitType() + ", 错误公司: " + JSONObject.toJSONString(reqDto1.getCompanyUuids()));
        }
        res.setResData(resDto);
        res.setResult(resDto.getResult());
        return res;
    }
}
